package com.ydlclass.compress;

import com.ydlclass.compress.impl.GzipCompress;
import com.ydlclass.config.ObjectWrapper;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 压缩工厂
 * @Author duWenJian
 * @Date 2024/2/25 11:53
 * @Version 1.0
 */
@Slf4j
public class CompressFactory {
    public static final Map<String, ObjectWrapper<Compress>> COMPRESS_MAP = new ConcurrentHashMap<>(16);
    public static final Map<Byte,ObjectWrapper<Compress>> COMPRESS_CODE_MAP = new ConcurrentHashMap<>(16);

    static {
        ObjectWrapper<Compress> gzip = new ObjectWrapper<>((byte) 1, "gzip", new GzipCompress());
        COMPRESS_MAP.put("gzip", gzip);
        COMPRESS_CODE_MAP.put(gzip.getCode(), gzip);
    }

    /**
     * 使用工厂方法获取
     * @param type
     * @return
     */
    public static ObjectWrapper<Compress> getCompress(String type) {
        ObjectWrapper<Compress> wrapper = COMPRESS_MAP.get(type);
        // 如果没有拿到，则用默认的压缩方式
        if (wrapper == null) {
            log.debug("没有找到对应的压缩方式，使用默认的gzip");
            return COMPRESS_MAP.get("gzip");
        }
        return COMPRESS_MAP.get(type);
    }
    public static ObjectWrapper<Compress> getCompress(byte code) {
        ObjectWrapper<Compress> wrapper = COMPRESS_MAP.get(code);
        // 如果没有拿到，则用默认的压缩方式
        if (wrapper == null ) {
            log.debug("没有找到对应的压缩方式，使用默认的gzip");
            return COMPRESS_MAP.get("gzip");
        }
        return COMPRESS_CODE_MAP.get(code);
    }

    /**
     * 添加压缩实现到工厂中
     * @param wrapper 压缩类型的包装
     */
    public static void addCompress(ObjectWrapper<Compress> wrapper ){
        COMPRESS_MAP.put(wrapper.getType(), wrapper);
        COMPRESS_CODE_MAP.put(wrapper.getCode(), wrapper);
    }

}
